/**

 * @CLASSDESCRIPER: 基于单链表实现队列的入队，出队 16：30-17：01
 *
 * 队列较与栈有两个出口，一头一尾
 * @AUTHOR:oh_young
 * @PHONE:13762094871
 * @EMIAL:13762094871@163.COM
 * @DATE: 2021/1/23
 */
public class OU_YANG_JIE_JUN_23_Q2<T>{
    private Node<T> node;

    public OU_YANG_JIE_JUN_23_Q2(){
        node=new Node<T>(null,null);//初始化
    }
    //创建结点
    private class Node<T>{
        T t;
        Node next;

        public Node(T t, Node next) {
            this.t = t;
            this.next = next;
        }
    }
    //队列做是否为空判断
    public boolean isEmpty(){
        return node==null;
    }
    //入队
    public void insert(T t){
        Node newNode=new Node(t,null);
        if (isEmpty()){
            node=newNode;//为空则为头结点
        }else{
            Node xin=node;//新入结点指向头结点
            while(xin.next!=null){
                xin=xin.next;
            }
            xin.next=newNode;//新加入结点为最后一个结点时

        }

    }
    //出队
    public T remove(){
        if (isEmpty()){
            System.out.print("队列是空的");
        }
        T t=node.t;
        node=node.next;//原结点的下一节点指向原结点，返回出队列的结点

        return t;
    }
    //打印队列
    public void show(){
        Node xin=node;
        while(xin!=null){
            System.out.print(xin.t+" ");
            xin=xin.next;
        }
    }





    /**
         * @Description: 主方法调用队列的insert和move
         * @Author: oh_young
         * @EMAIL:13762094871@163.COM
         * @Date: 2021/1/23 17:01

         **/
    public static void main(String[] args) {

        OU_YANG_JIE_JUN_23_Q2 ou2=new OU_YANG_JIE_JUN_23_Q2();
        ou2.insert(30);
        ou2.insert(20);
        ou2.insert(40);
        ou2.insert(50);


        ou2.remove();
        ou2.show();
    }

         /**
         * 疑问1： 第一个null是头出口吗？
         * 疑问2：
         * 疑问3:
         **/
}
